/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package beans;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author TalesHugo
 */
public class Usuario implements Serializable{

    // Login do usuário.
    private String login;
    // Senha do usuário.
    private String senha;
    // Nome do usuário.
    private String nome;
    // Descrição do usuário.
    private String descricao;
    // Estado Civil do usuário.
    private String estadoCivil;
    // Aniversário do usuário.
    private String aniversario;
    // Cidade Natal do usuário.
    private String cidadeNatal;
    // Lista de amigos do usuário.
    private List<Usuario> amigos = new LinkedList<Usuario>();
    // Lista auxiliar de usuários pendentes de aceitação de amizade do usuário.
    private List<Usuario> listaAuxiliar = new LinkedList<Usuario>();

    /**
     * Construtor da classe Usuário.
     * @param login Login do usuário.
     * @param senha Senha do usuário.
     * @param nome Nome do usuário.
     */
    public Usuario(String login, String senha, String nome){
        this.login = login;
        this.senha = senha;
        this.nome = nome;
    }

    /**
     * Método que retorna o login do usuário.
     * @return O login do usuário.
     */
    public String getLogin() {
        return login;
    }

    /**
     * Método que retorna a senha do usuário.
     * @return A senha do usuário.
     */
    public String getSenha() {
        return senha;
    }

    /**
     * Método que retorna o nome do usuário.
     * @return O nome do usuário.
     */
    public String getNome() {
        return nome;
    }

    /**
     * Método que retorna a descrição do usuário.
     * @return A descrição do usuário.
     */
    public String getDescricao() {
        return descricao;
    }

    /**
     * Método que retorna o estado civil do usuário.
     * @return O estado civil do usuário.
     */
    public String getEstadoCivil() {
        return estadoCivil;
    }

    /**
     * Método que retorna o aniversário do usuário.
     * @return O aniversário do usuário.
     */
    public String getAniversario() {
        return aniversario;
    }

    /**
     * Método que retorna a cidade natal do usuário.
     * @return A cidade natal do usuário.
     */
    public String getCidadeNatal() {
        return cidadeNatal;
    }

    /**
     * Método que modifica o valor da descrição do usuário.
     * @param descricao Descrição do usuário a ser modificada.
     */
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    /**
     * Método que modifica o valor do estado civil do usuário.
     * @param estadoCivil Estado Civil do usuário a ser modificado.
     */
    public void setEstadoCivil(String estadoCivil) {
        this.estadoCivil = estadoCivil;
    }

    /**
     * Método que modifica o valor do aniversário do usuário.
     * @param aniversario Aniversário do usuário a ser modificado.
     */
    public void setAniversario(String aniversario) {
        this.aniversario = aniversario;
    }

    /**
     * Método que modifica o valor da cidade natal do usuário.
     * @param cidadeNatal Cidade Natal do usuário a ser modificada.
     */
    public void setCidadeNatal(String cidadeNatal) {
        this.cidadeNatal = cidadeNatal;
    }

    /**
     * Método que retorna a lista auxiliar de usuários pendentes de aceitação de amizade do usuário.
     * @return Lista Auxiliar de usuários pendentes de aceitação de amizade do usuário.
     */
    public List getListaAuxiliar(){
        return this.listaAuxiliar;
    }

    /**
     * Método que retorna uma List de amigos.
     * @return List de amigos do usuário.
     */
    public List getAmigos(){
        return this.amigos;
    }

    /**
     * Método que adiciona um usuário a lista auxiliar do usuário.
     * @param user Usuário a ser adicionado a lista auxiliar do usuário.
     */
    public void solicitaAdicaoAmigo(Usuario user){
        this.listaAuxiliar.add(user);
    }

    /**
     * Método que checa se um usuário contem dentro de sua lista auxiliar outro usuário passado como parâmetro.
     * @param user1 Usuário a ser verificado se contem outro usuário passado como parâmetro dentro de sua lista auxiliar.
     * @param user2 Usuário que deverá estar dentro da lista auxiliar do usuário a ser verificado.
     * @return TRUE se o usuário a ser verificado contem outro usuário, passado como parâmetro, dentro de sua lista auxiliar, FALSE caso contrário.
     */
    public boolean contemPedido(Usuario user1, Usuario user2){
       if (user1.getListaAuxiliar().contains(user2)){
           return true;
       }
       return false;
   }

    /**
     * Método que checa se um usuário contem dentro de sua lista de amigos outro usuário passado como parâmetro.
     * @param user1 Usuário a ser verificado se contem outro usuário passado como parâmetro dentro de sua lista de amigos.
     * @param user2 Usuário que deverá estar dentro da lista de amigos do usuário a ser verificado.
     * @return TRUE se o usuário a ser verificado contem outro usuário, passado como parâmetro, dentro de sua lista de amigos, FALSE caso contrário.
     */
   public boolean contemAmizade(Usuario user1, Usuario user2){
       if (user1.getAmigos().contains(user2)){
           return true;
       }
       return false;
   }

   /**
     * Método que checa se um usuário está contido dentro da lista auxiliar de outro usuário e vice-versa.
     * @param user1 Usuário a ser verificado se contem outro usuário passado como parâmetro dentro de sua lista auxiliar e vice-versa.
     * @param user2 Usuário que deverá estar dentro da lista auxiliar do usuário a ser verificado e vice-versa.
     * @return TRUE se o usuário a ser verificado contem outro usuário, passado como parâmetro, dentro de sua lista auxiliar e vice-versa, FALSE caso contrário.
     */
    public boolean aceitaPedido(Usuario user1, Usuario user2){
        if (user1.getListaAuxiliar().contains(user2) && user2.getListaAuxiliar().contains(user1)){
            return true;
        }
        return false;
    }

    /**
     * Método que adiciona um usuário da lista de amigos do usuário.
     * @param user Usuário a ser adicionado da lista de amigos do usuário.
     */
    public void adicionaAmigo(Usuario user){
        this.amigos.add(user);
    }

    /**
     * Método que remove um usuário da lista de amigos do usuário.
     * @param user Usuário a ser removido da lista de amigos do usuário.
     */
    public void removeAmigo(Usuario user){
        this.amigos.remove(user);
    }

}
